// 引入基本认证模块，用于解析请求头中的token
const basicAuth = require('basic-auth')
// 引入jsonwebtoken模块，用于验证token的有效性
const jwt = require('jsonwebtoken')
// 引入一个配置文件，该文件包含设置token有效期的密钥
const {secretKey} = require('./tokentime').security
// 引入一个处理结果的模块，用于返回统一的响应格式
const result = require('@/config/handle')

// 创建一个Auth类，用于处理认证逻辑
class Auth{
    // 定义一个getter方法，返回一个中间件函数
    get m () {
        return async (ctx, next) => {
           // 使用basicAuth模块从请求头中解析出token
           const token = basicAuth(ctx.req)  
           // 如果没有token或者token的name属性不存在，抛出错误
           if(!token || !token.name){
             throw new result('token不存在',401)
           }
           // 尝试使用jsonwebtoken模块验证token
           let authcode; 
           try {
                authcode = jwt.verify(token.name, secretKey)
                 // 如果token验证成功，将解析出的用户ID存储在ctx.authcode中
           } catch (error) {
               // 如果捕获到错误，根据错误类型抛出不同的错误信息
               if(error.name=='TokenExpiredError'){
                   throw new result('token过期',401)
               }else{
                   throw new result('无效token',401)
               }
                 // 如果token验证成功，将解析出的用户ID存储在ctx.authcode中
           }
            ctx.auth ={
                uid:authcode.uid
            }
         
           // 继续执行后续的中间件或路由处理
           await next()
        }
    }
}

// 导出Auth类
module.exports = {
    Auth
}
